const promise1 = new Promise((resolve, reject) => {
  resolve("成功");
  //reject('失败');
});
const promise2 = promise1.then(
  //如果onFulfilled或onRejected返回一个值x
  //则运行Promise Resolution Procedure [[Resolve]](promise2, x)。
  function onFulfilled(value) {
    //如果promise2和x引用同一个对象，则以TypeError为原因拒绝promise,因为会卡在这里
    //如果x是一个promise，采用其状态[3.4]：
      //如果x处于待定状态，则promise2必须保持待定状态，直到x被实现或拒绝
      //如果/当x被实现时，用相同的值实现promise
      //如果/当x被拒绝时，用相同的原因拒绝promise
     let obj = {
        then:'字符串then'
        /* then(resolvePromise,rejectPromise){
            resolvePromise('新的成功')
            rejectPromise('新的失败');
            如果调用then导致抛出异常e，
            throw new Error('执行then的时候出错误');
        } */
     };
     //如果x不是对象或函数，则用x来实现promise
     //return  'hello';
  },
  function onRejected(reason) {
    return reason + "x";
  }
);
promise2.then(
  (value) => {
    console.log("promise2 onFulfilled ", value);
  },
  (reason) => {
    console.log("promise2 onRejected", reason);
  }
);
//Promise解决过程是一个抽象操作，接受一个promise和一个值作为输入
//我们将其表示为[[Resolve]](promise, x)
//如果x是一个thenable，它尝试使promise采用x的状态，假设x至少在某种程度上像一个promise。
//否则，它使用值x来实现promise

function Resolve(promise2, x) {
    //让then为x.then
    const then = x.then;
    //如果then不是一个函数，则以x来实现promise。
    //如果获取属性x .then导致抛出异常e，则以e为原因拒绝promise
    //如果then是一个函数，则以x作为this，第一个参数为resolvePromise，第二个参数为rejectPromise调用它，其中：
    then.call(x,resolvePromise,rejectPromise);
    //如果/当resolvePromise被调用并传入值y，运行[[Resolve]](promise2, y)。
}

//只要它有一个then的函数属性，我们就认为它是一个thenable
/* let p1 = new Promise();
let p2 = {
  then() {
    console.log("then");
  },
};
 */